package com.bird.singletonpattern;

/**
 * @Author: sijunqiang
 * @Date: 2020/4/12 16:36
 * @Description: 双重检查锁机制的懒汉模式 （能够保证在多线程情况下 线程是安全的）
 */
public class LazyDoubleCheckSingleton {
    /**
     * volatile:优点：
     * 1：被volatile修饰的变量能 保证了变量的可见性
     * 2： 被volatile 修饰变量 会严格的下面三个步骤执行的
     */
    private volatile static LazyDoubleCheckSingleton instance;


    private LazyDoubleCheckSingleton() {}

    public static LazyDoubleCheckSingleton getInstance() {

        if (instance == null) {
            /*加锁同步 synchronized：关键字能保证线程串行执行。在创建类的实例保证时安全的 */
            synchronized (LazyDoubleCheckSingleton.class) {
                if (instance == null) {
                    /** 此处省略了三个步骤
                     * 1:  memory=allocate(); //分配对象的内存地址
                     * 2： instance(memory); //初始化对象
                     *  3： instance=memory; // 设置instance指向刚分配的内存地址,此时instance!=null
                     * */
                    instance = new LazyDoubleCheckSingleton();
                }

            }
        }
        return instance;
    }

}
